package myjava.innerclassi;

public class Root3 {

   public static void main(String[] args) {

      Foo o1 = new Foo();

      /* se le inner sono dichiarate public (molto strano ma possibile!)
         ci puoi accedere da fuori la outer nei seguenti due modi */
      
      // inner statica : (non necessita istanza della outer)
      Foo.Fee o2 = new Foo.Fee();
      // inner normale : necessita istanza della outer
      // purtroppo io mi aspettavo di poter usarla cosi' ... ma non funziona
      // Foo.Faa o3 = o1.Faa();
      // ecco la sintassi permessa
      Foo.Faa o3 = o1.new Faa();
   }
}

class Foo {

   // # dallo statico solo Fee puo' venire invocata
   static void doIt() {
      Fee o1 = new Fee();
      /* Next one non funziona! Stai referenziando un'entita' di istanza da un contesto statico
         la inner normale fa parte dell'istanza */
      // Faa o2 = new Faa();
   }

   // # da un metodo di istanza puoi istaziarle entrambe
   public void reDoIt() {
      Fee o1 = new Fee();
      Faa o2 = new Faa();
   }

   public static class Fee {
      ;
   }

   public class Faa {
      ;
   }
}